#include <mips/regdef.h>
#include <sys/syscall.h>

#define BSIZE			(100)

	.text
	.align 	2
	.global main
	.ent 	main

main:
	.frame	$fp, 56, ra

	.set noreorder
	.cpload	t9
	.set reorder

	subu	sp,sp,56

	# Guardo los registros
	.cprestore 40
	sw		ra,48(sp)
	sw		$fp,44(sp)
	move	$fp,sp

	li		a0,	BSIZE
	jal 	mymalloc
	sw      v0, 16($fp) // buffer auxiliar

	# Leo de STDIN
	li		v0,	SYS_read
	li		a0,	0
	lw		a1,	16($fp)	// puntero de lectura
	li		a2,	BSIZE		// leo un byte
	syscall

	bne	a3,zero,read_error

eof:

	lw		a0, 16($fp)
	jal	length
	sw      v0, 28($fp)

	# malloc del buffer resultado
	lw		a0,	28($fp)
	jal 	mymalloc
	sw      v0, 36($fp) // buffer resultado
	
	# llamo a mergesort.
	lw	a0, 16($fp)		// input
	lw	a1, 36($fp)		// resultado
	jal	mergesort
	
	# Imprimo el resultado por pantalla
	li	v0, SYS_write 
	li	a0, 1
	lw	a1, 36($fp)
	lw	a2, 28($fp)
	syscall
	# Imprimo un salto de linea
	li		v0, SYS_write
	li		a0, 1
	la		a1, str_salto
	li		a2, 1
	syscall	
	
	# free del buffer resultado
	lw		a0,	36($fp)
	jal 	myfree		
	
	# free del buffer auxiliar
	lw		a0,	16($fp)
	jal 	myfree
	
	j	main_return

read_error:
	################
	li	v0, SYS_write 
	li	a0, 1
	la	a1,	str_error
	li	a2, 6
	syscall	
	################
	################
	li	v0, SYS_write 
	li	a0, 1
	la	a1,	str_salto
	li	a2, 1
	syscall	
	################
		
main_return:
	# destruyo el stack
	move	sp, $fp
	lw	$fp, 44(sp)
	lw	ra,  48(sp)
	addu	sp, sp, 56

	j	ra
	.end	main
	
	.rdata
str_hola: .asciiz	"hola\n"
str_error: .asciiz	"error\n"
str_while: .asciiz	"while\n"
str_salto: .asciiz	"\n"
str_fin: .asciiz	"\0"
str_count: .asciiz	"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
